Option Explicit

Implements IDummyDataTable

'################################################################
' Descriptor
' 真实表的临时数据表
'################################################################

'################################################################
' Field
'################################################################
' 真实表定义
Private tableDefine As DBTableDefine
' 内置数据表
Private innerTable As DataFrame
' 各行的标签
' Map<Integer, Set<String>>
Private rowTag As SimpleMap

' 各行使用的表达式（列定义 或 检索条件）
' Map<Integer, Set<String>>
Private rowExpression As SimpleMap

' 标签: 正确数据
Private rightDataTag As String
' 标签: 错误数据
Private wrongDataTag As String
' 加速缓存: 正确数据的行号
'Private 

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
    Set innerTable = New DataFrame
    Set rowTag = New SimpleMap
    Set rowExpression = New SimpleMap
End Sub

Private Sub Class_Terminate()
    Set innerTable = Nothing
    Set rowTag = Nothing
    Set rowExpression = Nothing
End Sub

'################################################################
' Init
'################################################################
' @param tableDefineVal 真实表的表定义
Public Sub Init(ByRef tableDefineVal As DBTableDefine)
    ' 保存表定义
    Set tableDefine = tableDefineVal

    ' 使用表的列名初始化内置数据表
    innerTable.InitByColumnNames(tableDefine.ColumnDefineMap.Keys)

    ' 设置标签内容
    rightDataTag = tableDefine.TableId & "_right"
    ' 标签: 错误数据
    wrongDataTag = tableDefine.TableId & "_wrong"
End Sub


'################################################################
' Implements IDummyDataTable
'################################################################
' 当前临时表的名称
Public Property Get IDummyDataTable_Name() As String
    IDummyDataTable_Name = tableDefine.TableId
End Property

' 获取表内的数据行数
Public Property Get IDummyDataTable_DataCount() As String
    IDummyDataTable_DataCount = innerTable.RowCount
End Property

' 添加一行新的数据
Public Sub IDummyDataTable_addNewRow()
    innerTable.AddEmptyRow
End Sub

' 返回指定列索引的所有正确数据
' 因为表中包含 String、Number 类型的数据所以这里使用 Variant
' @return List<Variant>
Public Function IDummyDataTable_getRightColumnDataByIndex(ByRef index As Integer) As Collection
End Function

' 返回指定列索引的所有异常数据
' 因为表中包含 String、Number 类型的数据所以这里使用 Variant
' @return List<Variant>
Public Function IDummyDataTable_getWrongColumnDataByIndex(ByRef index As Integer) As Collection
End Function

' 获取当前表内的所有数据
' @return List<DataFrameRow>
Public Function IDummyDataTable_getAllData() As Collection
End Function

' 获取当前表内的所有符合数据
' @return List<DataFrameRow>
Public Function IDummyDataTable_getRightData() As Collection
End Function

' 获取当前表内的所有不符合规则的数据
' @return List<DataFrameRow>
Public Function IDummyDataTable_getWrongData() As Collection
End Function

' 写入一个列的数据
' @param rowIndex 行索引，从 1 开始
' @param colName 列名
' @param val 需要设置到指定单元的数据
' @exception 如果行索引小于 1 或者大于当前最大行数，将会抛出异常
' @exception 如果列名不存在，则抛出异常
Public Sub IDummyDataTable_writeDataByColName(ByRef rowIndex As Long, ByRef sc As SqlColumnDefine, ByRef val As Variant)
    innerTable.setCellValByColName rowIndex, colName, val
End Sub

' 为指定行附加【正确数据】的标签
' @param rowIndex 行索引，从 1 开始
Public Sub IDummyDataTable_setRightDataTag(ByRef rowIndex As Long)
End Sub

' 为指定行设置【错误数据】的标签
' @param rowIndex 行索引，从 1 开始
Public Sub IDummyDataTable_setWrongDataTag(ByRef rowIndex As Long)
End Sub

' 添加指定行所属的标签
' @param rowIndex 行索引，从 1 开始
' @param tag 标签内容
Public Sub IDummyDataTable_addRowTag(ByRef rowIndex As Long, ByRef tag As String)
    Dim k As String
    Dim tempSet As ISet
    k = rowIndex & ""
    If rowTag.Exists(k) Then
        Set tempSet = rowTag.Item(k)
        tempSet.Add tag
    Else
        Set tempSet = UtilsSet.createHashSet
        tempSet.Add tag
        rowTag.Add k, tempSet
    End If
End Sub

' 添加指定行包含的表达式（列定义 + 检索条件）
' @param rowIndex 行索引，从 1 开始
' @param expression 需要添加的表达式
Public Sub IDummyDataTable_addRowExpression(ByRef rowIndex As Long, ByRef expression As IExpression)
    Dim k As String
    Dim tempSet As ISet
    k = rowIndex & ""
    If rowExpression.Exists(k) Then
        Set tempSet = rowExpression.Item(k)
        tempSet.Add expression
    Else
        Set tempSet = UtilsSet.createLinkedHashSet
        tempSet.Add expression
        rowExpression.Add k, tempSet
    End If
End Sub